home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 15 / CU Amiga Magazine's Super CD-ROM 15 (1997)(EMAP Images)(GB)[!][issue 1997-10].iso / CUCD / Programming / crossgcc_linux / m68k-amigaos / include / sys / msg.h < prev    next >
Encoding:
C/C++ Source or Header  |  1997-03-11  |  4.7 KB  |  163 lines

  1. /*    $NetBSD: msg.h,v 1.9 1996/02/09 18:25:18 christos Exp $    */
  2.  
  3. /*
  4.  * SVID compatible msg.h file
  5.  *
  6.  * Author:  Daniel Boulet
  7.  *
  8.  * Copyright 1993 Daniel Boulet and RTMX Inc.
  9.  *
  10.  * This system call was implemented by Daniel Boulet under contract from RTMX.
  11.  *
  12.  * Redistribution and use in source forms, with and without modification,
  13.  * are permitted provided that this entire comment appears intact.
  14.  *
  15.  * Redistribution in binary form may occur without any restrictions.
  16.  * Obviously, it would be nice if you gave credit where credit is due
  17.  * but requiring it would be too onerous.
  18.  *
  19.  * This software is provided ``AS IS'' without any warranties of any kind.
  20.  */
  21.  
  22. #ifndef _SYS_MSG_H_
  23. #define _SYS_MSG_H_
  24.  
  25. #include <sys/ipc.h>
  26.  
  27. /*
  28.  * The MSG_NOERROR identifier value, the msqid_ds struct and the msg struct
  29.  * are as defined by the SV API Intel 386 Processor Supplement.
  30.  */
  31.  
  32. #define MSG_NOERROR    010000        /* don't complain about too long msgs */
  33.  
  34. struct msqid_ds {
  35.     struct    ipc_perm msg_perm;    /* msg queue permission bits */
  36.     struct    msg *msg_first;    /* first message in the queue */
  37.     struct    msg *msg_last;    /* last message in the queue */
  38.     u_long    msg_cbytes;    /* number of bytes in use on the queue */
  39.     u_long    msg_qnum;    /* number of msgs in the queue */
  40.     u_long    msg_qbytes;    /* max # of bytes on the queue */
  41.     pid_t    msg_lspid;    /* pid of last msgsnd() */
  42.     pid_t    msg_lrpid;    /* pid of last msgrcv() */
  43.     time_t    msg_stime;    /* time of last msgsnd() */
  44.     long    msg_pad1;
  45.     time_t    msg_rtime;    /* time of last msgrcv() */
  46.     long    msg_pad2;
  47.     time_t    msg_ctime;    /* time of last msgctl() */
  48.     long    msg_pad3;
  49.     long    msg_pad4[4];
  50. };
  51.  
  52. struct msg {
  53.     struct    msg *msg_next;    /* next msg in the chain */
  54.     long    msg_type;    /* type of this message */
  55.                     /* >0 -> type of this message */
  56.                     /* 0 -> free header */
  57.     u_short    msg_ts;        /* size of this message */
  58.     short    msg_spot;    /* location of start of msg in buffer */
  59. };
  60.  
  61. /*
  62.  * Structure describing a message.  The SVID doesn't suggest any
  63.  * particular name for this structure.  There is a reference in the
  64.  * msgop man page that reads "The structure mymsg is an example of what
  65.  * this user defined buffer might look like, and includes the following
  66.  * members:".  This sentence is followed by two lines equivalent
  67.  * to the mtype and mtext field declarations below.  It isn't clear
  68.  * if "mymsg" refers to the naem of the structure type or the name of an
  69.  * instance of the structure...
  70.  */
  71. struct mymsg {
  72.     long    mtype;        /* message type (+ve integer) */
  73.     char    mtext[1];    /* message body */
  74. };
  75.  
  76.  
  77. #ifdef _KERNEL
  78. /*
  79.  * Based on the configuration parameters described in an SVR2 (yes, two)
  80.  * config(1m) man page.
  81.  *
  82.  * Each message is broken up and stored in segments that are msgssz bytes
  83.  * long.  For efficiency reasons, this should be a power of two.  Also,
  84.  * it doesn't make sense if it is less than 8 or greater than about 256.
  85.  * Consequently, msginit in kern/sysv_msg.c checks that msgssz is a power of
  86.  * two between 8 and 1024 inclusive (and panic's if it isn't).
  87.  */
  88. struct msginfo {
  89.     int    msgmax,        /* max chars in a message */
  90.         msgmni,        /* max message queue identifiers */
  91.         msgmnb,        /* max chars in a queue */
  92.         msgtql,        /* max messages in system */
  93.         msgssz,        /* size of a message segment (see notes above) */
  94.         msgseg;        /* number of message segments */
  95. };
  96. struct msginfo    msginfo;
  97.  
  98. #ifndef MSGSSZ
  99. #define MSGSSZ    8        /* Each segment must be 2^N long */
  100. #endif
  101. #ifndef MSGSEG
  102. #define MSGSEG    2048        /* must be less than 32767 */
  103. #endif
  104. #undef MSGMAX            /* ALWAYS compute MGSMAX! */
  105. #define MSGMAX    (MSGSSZ*MSGSEG)
  106. #ifndef MSGMNB
  107. #define MSGMNB    2048        /* max # of bytes in a queue */
  108. #endif
  109. #ifndef MSGMNI
  110. #define MSGMNI    40
  111. #endif
  112. #ifndef MSGTQL
  113. #define MSGTQL    40
  114. #endif
  115.  
  116. /*
  117.  * macros to convert between msqid_ds's and msqid's.
  118.  * (specific to this implementation)
  119.  */
  120. #define MSQID(ix,ds)    ((ix) & 0xffff | (((ds).msg_perm.seq << 16) & 0xffff0000))
  121. #define MSQID_IX(id)    ((id) & 0xffff)
  122. #define MSQID_SEQ(id)    (((id) >> 16) & 0xffff)
  123. #endif
  124.  
  125. /*
  126.  * The rest of this file is specific to this particular implementation.
  127.  */
  128.  
  129. #ifdef _KERNEL
  130.  
  131. /*
  132.  * Stuff allocated in machdep.h
  133.  */
  134. struct msgmap {
  135.     short    next;        /* next segment in buffer */
  136.                     /* -1 -> available */
  137.                     /* 0..(MSGSEG-1) -> index of next segment */
  138. };
  139.  
  140. char *msgpool;            /* MSGMAX byte long msg buffer pool */
  141. struct msgmap *msgmaps;        /* MSGSEG msgmap structures */
  142. struct msg *msghdrs;        /* MSGTQL msg headers */
  143. struct msqid_ds *msqids;    /* MSGMNI msqid_ds struct's */
  144.  
  145. #define MSG_LOCKED    01000    /* Is this msqid_ds locked? */
  146.  
  147. #endif
  148.  
  149. #ifndef _KERNEL
  150. #include <sys/cdefs.h>
  151.  
  152. __BEGIN_DECLS
  153. int msgctl __P((int, int, struct msqid_ds *));
  154. int msgget __P((key_t, int));
  155. int msgsnd __P((int, void *, size_t, int));
  156. int msgrcv __P((int, void *, size_t, long, int));
  157. __END_DECLS
  158. #else
  159. void msginit __P((void));
  160. #endif /* !_KERNEL */
  161.  
  162. #endif /* !_SYS_MSG_H_ */
  163.